In [1]:
cat ./english_greeter.c
In [2]:
cat ./first_example.c
In [3]:
gcc -Wall -pedantic first_example.c --std=c99 -o example
Como vemos, compila sin errores
In [4]:
./example
Pero eso tiene varios problemas. Por ejemplo, estamos agregando a nuestro codigo cosas que no nos interesan. Mas aun, cosas de la implementacion pueden entrar en conflicto con cosas de nuestro programa. En este caso, la definicion de los macros "MESSAGE" conflictuan entre si.
In [5]:
cat ./english_greeter2.c
In [6]:
cat ./first_example_b.c
In [7]:
gcc -Wall -pedantic first_example_b.c --std=c99 -o example
In [8]:
cat ./second_example.c
In [9]:
cat ./greeter.h
In [10]:
cat ./greeter.c
In [11]:
gcc -Wall -pedantic second_example.c --std=c99 -o example
La compilacion de esa manera falla. El compilador sabe que hay una funcion greet
pero no que hace. ¿Por que? porque al incluir el .h
es como si definieramos en nuestro .c
solo el prototipo de la funcion greet
. Notar que no es el mismo error que si no estuviese la definicion de la funcion:
In [12]:
cat ./second_example_b.c
In [13]:
gcc -Wall -pedantic second_example_b.c --std=c99 -o example
Para poder utilizar nuestros archivos, primero debemos generar el codigo objeto del mismo. En este caso:
In [14]:
cat ./greeter.h
In [15]:
cat ./greeter.c
In [16]:
gcc -Wall -pedantic greeter.c --std=c99 -c
El parametro -c
le dice al compilador que genere el codigo objeto del archivo que estamos pasando. Esto nos va a generar un archivo .o
. Ahora solo resta decirle al compilador que lo pegue a nuestro codigo principal:
In [17]:
gcc -Wall -pedantic second_example.c greeter.o --std=c99 -o example
In [18]:
./example
In [24]:
cat ./third_example.c
In [25]:
cat ./greeter.h
Ahora vamos a generar codigo objeto de nuestro greeter en ingles:
In [26]:
cat ./english_greeter.c
In [27]:
gcc -Wall -pedantic english_greeter.c --std=c99 -c -o greeter.o
In [28]:
gcc -Wall -pedantic third_example.c greeter.o --std=c99 -o example
In [29]:
./example
Notar que compilamos english_greeter.c
en un archivo llamado greeter.o
. El codigo objeto no necesariamente se tiene que llamar igual que el archivo fuente.
Ahora supongamos que quiero cambiar el idioma de mi programa. Bueno, simplemente compilo utilizando un greeter diferente, por ejemplo uno en español:
In [30]:
cat ./spanish_greeter.c
In [31]:
gcc -Wall -pedantic spanish_greeter.c --std=c99 -c -o greeter.o
In [32]:
gcc -Wall -pedantic third_example.c greeter.o --std=c99 -o example
In [33]:
./example
Esto nos permite cambiar facilmente entre una u otra implementacion. Uno podria por ejemlo distribuir los fuentes de este programa y que el usuario compile el programa en un idioma u otro. ¿Como hacer esto? Proximamente en clase...